100  '**********************************************************************
110  '********                                                   ***********
120  '********           NORMAL DISTRIBUTION ROUTINES            ***********
130  '********                                                   ***********
140  '**********************************************************************
150  '            *   COPYRIGHT 1982 - CRAIG W. UTHE          *
160  '            *   WRITTEN 3/3/82 BY CRAIG W. UTHE         *
170  '            *                 * * * *                   *
180  '            *   ANY INDIVIDUAL MAY COPY THIS PROGRAM    *
190  '            *   AND MAKE MODIFICATIONS TO IT IF THAT    *
200  '            *   INDIVIDUAL ARRANGES TO CONTRIBUTE ONE   *
210  '            *   OTHER PROGRAM TO THE PHILA. AREA IBM    *
215  '            *   PC USER GROUP PUBLIC DOMAIN SOFTWARE    *
220  '            *   EXCHANGE LIBRARY.  HOWEVER, COPIES      *
230  '            *   ARE NOT ALLOWED TO BE SOLD, NOT IN      *
240  '            *   WHOLE NOR IN PART, NOT SEPARATELY       *
250  '            *   NOR JOINTLY WITH OTHER SOFTWARE.        *
260  '            *********************************************
270  '
280  '
1000 'MASTER-CONTROL ROUTINE
1010     CLS
1020     PRINT "This program computes areas under the normal distribution"
1030     PRINT "probability curve from the mean to a designated `Z' value."
1040     PRINT "This program also can compute `Z' values from a given area."
1050     PRINT
1060     PRINT "Just as in most statistical tables, only half the curve is
1070     PRINT "considered.  Z values must be between -4 and +4 (these"
1080     PRINT "limits are somewhat arbitrary) and area figures must be"
1090     PRINT "between 0 and 0.5 (actually .49997).  If out-of-range"
1100     PRINT "figures are input, the nearest range limit is assumed"
1110     PRINT "instead."
1120     PRINT
1130     PRINT "HIT ANY KEY TO START"
1140     SELECTION$ = INKEY$ : IF SELECTION$ = "" THEN GOTO 1140 'SAME LINE
1150     ' Area results (given Z) are accurate to the 5 displayed digits.
1160     ' Z values are accurate to 2 digits based on an input area,
1170     ' or the 3 displayed digits based on the program's approximation
1180     ' of that area.
1190     '
1200     ' This precision can be changed by changing the precision
1210     ' constants in the program from their 0.000001 setting.
1220     ' For higher precision, you might also want to change the
1230     ' variables to double, instead of single, precision form.
1240     ' With higher precision, you may wish to change the number
1250     ' of digits displayed, too.
1260     '
1270     ' Out of respect, please do not mutilate the structured
1280     ' programming approach that makes changes so easy and
1290     ' makes the program almost readable.  Of course you can
1300     ' easily use the subroutines in more elaborate programs.
1310     ' This program is fairly insignificant by itself.
1320     '
1330     SELECTION$ = "1" 'initialization
1340     WHILE (SELECTION$ = "1" OR SELECTION$ = "2")
1350         CLS : PRINT STRING$(60,42)
1360         PRINT : PRINT "MENU:"
1370         PRINT : PRINT "     <1> . . . . . . . . COMPUTE AREA FROM Z"
1380         PRINT : PRINT "     <2> . . . . . . . . COMPUTE Z VALUE FROM AREA"
1390         PRINT : PRINT "     <ANY OTHER KEY> . . EXIT PROGRAM"
1400         PRINT : PRINT STRING$(60,45)
1410         PRINT : PRINT "HIT ANY KEY IN INDICATED RANGE TO MAKE SELECTION:"
1420         SELECTION$ = INKEY$ : IF SELECTION$ = "" THEN GOTO 1420 'SAME LINE
1430         CLS : PRINT "THANK YOU."
1440         IF 0 = INSTR("12",SELECTION$)                                                       THEN : PRINT "I HOPE THE PROGRAM WAS USEFUL TO YOU.  BYE."                             : GOTO 1480 'WEND
1450         ON INSTR("12",SELECTION$) GOSUB 3000,2000
1460             'IE:  IF 1, GOSUB COMPUTE-Z-FROM-AREA ROUTINE
1470             '     IF 2, GOSUB COMPUTE-AREA-FROM-Z ROUTINE
1480         WEND
1490     END
1500 '
1510 '
2000 'COMPUTE-Z-FROM-AREA ROUTINE
2010     PRINT : PRINT STRING$(80,42) : PRINT
2020     QUIT% = 0
2030     WHILE NOT QUIT%
2040            PRINT "INPUT AREA VALUE FROM WHICH TO COMPUTE FREQUENCY."
2050            PRINT "(ENTRIES OVER 5.0 CAUSE RETURN TO MENU.)"
2060            INPUT "INPUT AREA VALUE (0 TO 0.49997): ",AREA
2070            IF AREA > 5 THEN QUIT% = -1 : GOTO 2230 'WEND
2080            HI.CALCULATED.AREA = .49997 : HI.Z = 4  '*** area < .49997
2090            LO.CALCULATED.AREA = 0      : LO.Z = 0  '*** area > 0
2100            IF AREA >= .49997 THEN CALCULATED.AREA = .49997 : Z = 4                                                 : GOTO 2170
2110            IF AREA <= 0 THEN CALCULATED.AREA = 0 : Z = 0 : GOTO 2170 'PRNT
2120            WHILE ABS(CALCULATED.AREA - AREA) > .000001
2130                    IF AREA > CALCULATED.AREA                                                          THEN LO.CALCULATED.AREA = CALCULATED.AREA : LO.Z = Z                            ELSE HI.CALCULATED.AREA = CALCULATED.AREA : HI.Z = Z
2140                    Z = (LO.Z + HI.Z) / 2
2150                    GOSUB 4000 'McLAUREN-METHOD-AREA-CALCULATION ROUTINE
2160                    WEND
2170            PRINT : PRINT "THE NORMAL-DISTRIBUTION Z-VALUE CORRESPONDING"
2180                    PRINT "TO A MEAN-TO-Z AREA OF ";
2190                    PRINT USING "#.#####"; CALCULATED.AREA;
2200                    PRINT " is:  ";
2210                    PRINT USING "#.###"; Z
2220            PRINT : PRINT STRING$(80,42) : PRINT
2230            WEND
2240     RETURN
2250 '
3000 'COMPUTE-AREA-FROM-Z ROUTINE
3010     PRINT : PRINT STRING$(80,42) : PRINT
3020     QUIT% = 0
3030     WHILE NOT QUIT%
3040            PRINT "INPUT Z VALUE FROM WHICH TO COMPUTE FREQUENCY."
3050            PRINT "(ENTRIES OVER 5.0 CAUSE RETURN TO MENU.)"
3060            INPUT "INPUT Z VALUE (-4.0 TO +4.0):  ", Z
3070            IF Z >= 5 THEN QUIT% = -1 : GOTO 3150 'WEND
3080            IF ABS(Z) >= 4 THEN CALCULATED.AREA = .49997 : Z.SGN% = SGN(Z)                                  : Z = 4 :GOTO 3100 'PRINT OUTPUT
3090            GOSUB 4000 'McLAUREN-METHOD-AREA-CALCULATION ROUTINE
3100            PRINT :PRINT "THE AREA UNDER THE NORMAL DISTRIBUTION CURVE"
3110                    PRINT "FROM THE MEAN TO Z = " Z.SGN%*Z " IS:  ";
3120                    PRINT USING "#.#####"; CALCULATED.AREA
3130            PRINT
3140            PRINT : PRINT STRING$(80,42) : PRINT
3150            WEND
3160     RETURN
3170 '
4000 'McLAUREN-METHOD-AREA-CALCULATION ROUTINE
4010     '
4020     Z.SGN% = SGN(Z) : Z = ABS(Z) : Z.SQR = Z*Z
4030     CALCULATED.AREA = Z * (1/SQR(2*3.141592654#))
4040     Z.CONSTANT = CALCULATED.AREA
4050     PRECISION.ERROR = 1 : INTERMEDIATE.TERM = 1 : I% = 1
4060     '
4070     WHILE ABS(PRECISION.ERROR) > .000001
4080            INTERMEDIATE.TERM = -(INTERMEDIATE.TERM * Z.SQR) / (2*I%)
4090            PRECISION.ERROR = Z.CONSTANT * (INTERMEDIATE.TERM / (2*I% + 1))
4100            CALCULATED.AREA = CALCULATED.AREA + PRECISION.ERROR
4110            I% = I% + 1
4120            WEND
4130            CALCULATED.AREA = CALCULATED.AREA - PRECISION.ERROR
4140     RETURN
      I% = I% + 1
4120            WEND
4130          